package com.ruoyi.trackapply.domain;

/**
 * {
 * "input": {
 * "isTleFlag":false,传参
 * "tleFilePath":"/mnt/hgfs/orbitPredictionJson_linux/input/tle.txt",传参， （数据库获取，根据开始时间、目标编号，获取tle数据并写入txt）
 * "IsGNSSpre":true,传参
 * "gnssFilePath":"/mnt/hgfs/orbitPredictionJson_linux/input/GNV1B_2020-06-10_C_04.txt",传参   （数据库获取，刘博士,根据开始时间、结束时间、目标编号获取数据并写入txt,内容参考文档，# End of YAML header后面内容）
 * "Type": "Hpop",
 * "BeginTime": { （传参，当用预报时，开始时间需要在数据文件时间之后，大于等于）
 * "BeginTime_Year": 2020,
 * "BeginTime_Month": 6,
 * "BeginTime_Day": 11,
 * "BeginTime_Hour": 0,
 * "BeginTime_Min": 11,
 * "BeginTime_sec": 21.639125049114227 （秒数为float ,21.0也可以）
 * },
 * "EndTime": {（传参，结束时间为开始时间+3天）
 * "EndTime_Year": 2020,
 * "EndTime_Month": 6,
 * "EndTime_Day": 13,
 * "EndTime_Hour": 0,
 * "EndTime_Min": 11,
 * "EndTime_sec": 21.639125049114227  （秒数为float ,21.0也可以）
 * },
 * "Interval": 60.0,（TLE和GNSS预报等同，都为常数）
 * "Kepler": {   （TLE和GNSS预报等同，常数）
 * "InitTime_Year": 2024,
 * "InitTime_Month": 4,
 * "InitTime_Day": 14,
 * "InitTime_Hour": 6,
 * "InitTime_Min": 11,
 * "InitTime_sec": 11.639125049114227,
 * "SemiMajorAxis": 6943580.1897729235,
 * "Eccentricity": 0.0011299485710710312,
 * "Inclination": 0.7510332097172384,
 * "Raan": 3.1003524228031516,
 * "ArgOfPerigee": 0.5912494210483233,
 * "MeanAnomaly": 5.6966273639935086
 * },
 * "ForceModelPara": { （如果用TLE预报，则该部分参数为常数，如果为GNSS预报，这部分参数为后端参数传参，标注部分为修改内容，其他内容为常数）
 * "CallType": 0,（常数）
 * "GravityPath": "",（常数）
 * "MaxDegree": 21,（常数）
 * "MaxOrder": 21,（常数）
 * "UseSolidTides": true,（常数）
 * "UseOceanTides": true,（常数）
 * "DragUse": true,（常数）
 * "DragCd": 2.1,（数据库中根据目标编号获取，阻力系数值）
 * "DragArea": 8.3,（数据库中根据目标编号获取，卫星面积）
 * "DragMass": 816.5,（数据库中根据目标编号获取，卫星质量）
 * "AtmDensityModel": 1,（前端传参）
 * "EnterType": 0,（常数）
 * "DailyF": 150.0,（常数）
 * "AverageF": 150.0,（常数）
 * "GeomagneticIndex": 3.0,（常数）
 * "FluxApPath": "",（常数）
 * "GeomagUpdateRate": 0,（常数）
 * "GeomagneticFluxSource": 0,（常数）
 * "SolarPressureUse": true,（常数）
 * "Cr": 1.0,（数据库中根据目标编号获取，光压系数）
 * "SolarPressureArea": 10.0,（常数）
 * "ShadowModel": 2,（常数）
 * "UseBoundaryMitigation": false,（常数）
 * "ThirdBodyGravity": [ true, true, false, false, false, false, false, false, false, false ],
 * "IBURN": 0,（常数）
 * "listBURN": [（常数）
 * {
 * "Start_Year": 2024,
 * "Start_Month": 4,
 * "Start_Day": 15,
 * "Start_Hour": 12,
 * "Start_Min": 54,
 * "Start_sec": 27.442989349365234,
 * "End_Year": 2024,
 * "End_Month": 4,
 * "End_Day": 15,
 * "End_Hour": 13,
 * "End_Min": 4,
 * "End_sec": 27.442989349365234,
 * "thrustX": 28000000.0,
 * "thrustY": 0.0,
 * "thrustZ": 0.0
 * }
 * ],
 * "MAXBURN": 1,
 * "Drag2R3": 1.2e-14
 * }
 * },
 * "output": { "filePath": "/mnt/hgfs/orbitPredictionJson_linux/orbitTest/outPut/" },（传参）
 * "conf": {
 * "dataPath": "/mnt/hgfs/orbitPredictionJson_linux/orbitTest/data/ADP/",（传参）
 * "ephFilePath": "/mnt/hgfs/orbitPredictionJson_linux/orbitTest/data/ADP/JPLEPH.414",（传参）
 * "3rdpartyFileDir": "/mnt/hgfs/orbitPredictionJson_linux/orbitTest/3rdparty/"（传参）
 * }
 * }
 */

import cn.hutool.core.collection.ListUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 * 调用脚本 预报json
 */

@Data
public class ForcastInputJsonBO {

    private InputBO input;

    //输出路径
    private ForcastOutputBO output;

    //一些配置项
    private ForcastConfBO conf;

    @Data
    public class InputBO {
        //是否 tle 与  IsGNSSpre互斥
        @JsonProperty("isTleFlag")
        private boolean isTleFlag;
        //数据库获取，根据开始时间、目标编号，获取tle数据并写入txt
        @JsonProperty("tleFilePath")
        private String tleFilePath = "";
        @JsonProperty("IsGNSSpre")
        private boolean IsGNSSpre = !isTleFlag;
        //数据库获取，根据开始时间、目标编号，获取gnns数据并写入txt
        private String gnssFilePath = "";

        @JsonProperty("Type")
        private String Type = "Hpop";

        //预报时
        @JsonProperty("BeginTime")
        private StartTimeBO BeginTime;

        //预报时
        @JsonProperty("EndTime")
        private EndTimeBO EndTime;

        @JsonProperty("Interval")
        //TLE和GNSS预报等同，都为常数  数据步长
        private Integer Interval;

        @JsonProperty("Kepler")
        private Kepler Kepler = new Kepler();

        @JsonProperty("ForceModelPara")
        private ForceModelParaBO ForceModelPara;

    }


    /**
     * 传参，当用预报时，开始时间需要在数据文件时间之后，大于等于
     * 结束时间为开始时间+3天
     */
    @Data
    public class StartTimeBO {
        @JsonProperty("BeginTime_Year")
        private Integer BeginTime_Year;
        @JsonProperty("BeginTime_Month")
        private Integer BeginTime_Month;
        @JsonProperty("BeginTime_Day")
        private Integer BeginTime_Day;
        @JsonProperty("BeginTime_Hour")
        private Integer BeginTime_Hour;
        @JsonProperty("BeginTime_Min")
        private Integer BeginTime_Min;
        @JsonProperty("BeginTime_sec")
        private Double BeginTime_sec;
    }

    /**
     * 传参，当用预报时，开始时间需要在数据文件时间之后，大于等于
     * 结束时间为开始时间+3天
     */
    @Data
    public class EndTimeBO {
        @JsonProperty("EndTime_Year")
        private Integer EndTime_Year;
        @JsonProperty("EndTime_Month")
        private Integer EndTime_Month;
        @JsonProperty("EndTime_Day")
        private Integer EndTime_Day;
        @JsonProperty("EndTime_Hour")
        private Integer EndTime_Hour;
        @JsonProperty("EndTime_Min")
        private Integer EndTime_Min;
        @JsonProperty("EndTime_sec")
        private Double EndTime_sec;
    }


    /**
     * TLE和GNSS预报等同
     */
    @Data
    public class Kepler {
        @JsonProperty("InitTime_Year")
        private Integer InitTime_Year = 2024;
        @JsonProperty("InitTime_Month")
        private Integer InitTime_Month = 4;
        @JsonProperty("InitTime_Day")
        private Integer InitTime_Day = 14;
        @JsonProperty("InitTime_Hour")
        private Integer InitTime_Hour = 6;
        @JsonProperty("InitTime_Min")
        private Integer InitTime_Min = 11;
        @JsonProperty("InitTime_sec")
        private Double InitTime_sec = 11.639125049114227;
        @JsonProperty("SemiMajorAxis")
        private Double SemiMajorAxis = 6943580.1897729235;
        @JsonProperty("Eccentricity")
        private Double Eccentricity = 0.0011299485710710312;
        @JsonProperty("Inclination")
        private Double Inclination = 0.7510332097172384;
        @JsonProperty("Raan")
        private Double Raan = 3.1003524228031516;
        @JsonProperty("ArgOfPerigee")
        private Double ArgOfPerigee = 0.5912494210483233;
        @JsonProperty("MeanAnomaly")
        private Double MeanAnomaly = 5.6966273639935086;
    }

    /**
     * 如果用TLE预报，则该部分参数为常数，
     * 如果为GNSS预报，这部分参数为后端参数传参
     */
    @Data
    public class ForceModelParaBO {
        @JsonProperty("CallType")
        private int CallType = 0;//（常数）
        @JsonProperty("GravityPath")
        private String GravityPath = "";//（常数）
        @JsonProperty("MaxDegree")
        private int MaxDegree = 21;//（常数）
        @JsonProperty("MaxOrder")
        private int MaxOrder = 21;//（常数）
        @JsonProperty("UseSolidTides")
        private boolean UseSolidTides = true;//（常数）
        @JsonProperty("UseOceanTides")
        private boolean UseOceanTides = true;//（常数）
        @JsonProperty("DragUse")
        private boolean DragUse = true;//（常数）
        @JsonProperty("DragCd")
        private Double DragCd = 2.1;//（数据库中根据目标编号获取，阻力系数值）
        @JsonProperty("DragArea")
        private Double DragArea = 8.3;//（数据库中根据目标编号获取，卫星面积）
        @JsonProperty("DragMass")
        private Double DragMass = 816.5;//（数据库中根据目标编号获取，卫星质量）
        @JsonProperty("AtmDensityModel")

        private int AtmDensityModel = 1;//（前端传参）

        @JsonProperty("WindFieldModel")
        //大气风场模型  0.关闭（默认）；1.HWM07；2.HWCM。
        private int WindFieldModel = 0;

        @JsonProperty("EnterType")
        private int EnterType = 0;//（常数）
        @JsonProperty("DailyF")
        private int DailyF = 150;//（常数）
        @JsonProperty("AverageF")
        private int AverageF = 150;//（常数）
        @JsonProperty("GeomagneticIndex")
        private int GeomagneticIndex = 3;//（常数）
        @JsonProperty("FluxApPath")
        private String FluxApPath = "";//（常数）
        @JsonProperty("GeomagUpdateRate")
        private int GeomagUpdateRate = 0;//（常数）
        @JsonProperty("GeomagneticFluxSource")
        private int GeomagneticFluxSource = 0;//（常数）
        @JsonProperty("SolarPressureUse")
        private boolean SolarPressureUse = true;//（常数）
        @JsonProperty("Cr")
        private Double Cr = 1.0; //（数据库中根据目标编号获取，光压系数）
        @JsonProperty("SolarPressureArea")
        private int SolarPressureArea = 10;//（常数）
        @JsonProperty("ShadowModel")
        private int ShadowModel = 2;//（常数）
        @JsonProperty("UseBoundaryMitigation")
        private boolean UseBoundaryMitigation = false;//（常数）
        @JsonProperty("ThirdBodyGravity")
        private boolean[] ThirdBodyGravity = new boolean[]{true, true, false, false, false, false, false, false, false, false};
        @JsonProperty("IBURN")
        private int IBURN = 0;//（常数）
        @JsonProperty("listBURN")
        private List<BurnBO> listBURN = ListUtil.of(new BurnBO());
        @JsonProperty("MAXBURN")
        private int MAXBURN = 1;
        @JsonProperty("Drag2R3")
        private double Drag2R3 = 1.2e-14;
    }

    //常数
    @Data
    public class BurnBO {
        @JsonProperty("Start_Year")
        private int Start_Year = 2024;
        @JsonProperty("Start_Month")
        private int Start_Month = 4;
        @JsonProperty("Start_Day")
        private int Start_Day = 15;
        @JsonProperty("Start_Hour")
        private int Start_Hour = 12;
        @JsonProperty("Start_Min")
        private int Start_Min = 54;
        @JsonProperty("Start_sec")
        private double Start_sec = 27.442989349365234;
        @JsonProperty("End_Year")
        private int End_Year = 2024;
        @JsonProperty("End_Month")
        private int End_Month = 4;
        @JsonProperty("End_Day")
        private int End_Day = 15;
        @JsonProperty("End_Hour")
        private int End_Hour = 13;
        @JsonProperty("End_Min")
        private int End_Min = 4;
        @JsonProperty("End_sec")
        private double End_sec = 27.442989349365234;
        @JsonProperty("thrustX")
        private double thrustX = 28000000.0;
        @JsonProperty("thrustY")
        private double thrustY = 0.0;
        @JsonProperty("thrustZ")
        private double thrustZ = 0.0;
    }

    @Data
    public class ForcastOutputBO {
        @JsonProperty("filePath")
        private String filePath;
    }

    @Data
    public class ForcastConfBO {
        @JsonProperty("dataPath")
        private String dataPath;
        @JsonProperty("ephFilePath")
        private String ephFilePath;
        @JsonProperty("3rdpartyFileDir")
        private String str;
    }
}
